package reflect;

import java.util.ArrayList;
import java.util.Scanner;

/**
 * Java反射机制
 * 反射是java的动态机制，允许程序在运行期间在确定如对象的实例化，方法的调用和属性的操作
 * 反射机制可提高代码灵活性和可扩展性，但是具有较慢的运行效率和较多的系统开销
 * 所以反射机制不宜过度使用
 */
public class ReflectDemo1 {
    public static void main(String[] args) throws ClassNotFoundException {
        /*
            反射操作的第一步:获取类对象(Class的实例)--------------详见手写笔记
            Class类:反射对象之一
            该类的每一个实例用于表示JVM加载的一个类:JVM加载一个类的字节码文件后就会实例化
            一个Class的实例记录加载类的一切信息并与之绑定，因此在JVM内部每个被加载的类都有
            且只有一个Class的实例
            通过Class的实例就可以"反应"(reflect)出该类的一切信息:类名，包信息，注解，构造器，方法等

            获取类对象的方式:
            1:类名.class
              Class cls = String.class;
              Class cls = int.class;//基本类型也可以获取类对象，但是方式只有这一种

            2:Class.forName(String className)    其中，className:类完全限定名
              Class.forName(pack+"."+Name)
              根据类的完全限定名(包名.类名)形式获取类对象
              Class cls = Class.forName("java.lang.String");

            3:类加载器获取ClassLoader
         */

        //获取String,ArrayList的类对象----------------------------------
        Class c = String.class;
        Class c1 = ArrayList.class;
        System.out.println(c);

        //通过指定类的完全限定名加载类对象----------------------------------
        Class  cl = Class.forName("java.lang.String");
        Class  cls = Class.forName("java.util.ArrayList");


        //通过 类对象 获取其表示的类的完全限定名
        String className = cls.getName();//需要用字符串去接收
        System.out.println(className);

        //仅获得类名
        System.out.println(cls.getSimpleName());

        /*
            通过 类对象 反应该类的包信息？
            Package的每一个实例用于表示一个包的信息
         */
        Package pack = cls.getPackage();
        //获取包名
        System.out.println(pack.getName());
        //输出包信息
        System.out.println("包名:"+pack);

    }
}
